import type { CSSProperties } from 'vue'

/**
 * @typedef {Object} ActionsButtonType
 * @description 按钮类型定义，用于描述操作按钮的属性。
 *
 * @property {string} label - 按钮的标签文本。
 * @property {any} value - 自定义值。
 * @property {string[]} [perms] - 可选的权限数组，定义哪些用户可以看到或使用这个按钮。
 * @property {(row: any, item?: any) => void} [click] - 可选的点击事件处理函数。
 * @param {any} row - 当前行的数据。
 * @param {any} [item] - 可选的附加项数据。
 *
 * @property {(row: any, item?: any) => boolean} [render] - 可选的渲染函数，根据条件返回是否渲染该按钮。
 * @param {any} row - 当前行的数据。
 * @param {any} [item] - 可选的附加项数据。
 * @returns {boolean} 如果返回 true，则渲染按钮；否则不渲染。
 *
 * @property {'primary' | 'success' | 'warning' | 'danger' | 'info'} [type] - 按钮类型，定义按钮的样式。
 */
export type ActionsButtonType = {
  label: string
  value?: any
  perms?: string[]
  click?: (row: any, item?: any) => void
  render?: (row: any, item?: any) => boolean
  type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'
}

/**
 * 列类型定义，表示表格组件的一个列配置。
 *
 * @property {string} label - 列的标题。
 * @property {string|Array<string>} prop - 列对应的数据属性名或路径。
 * @property {string} [type] - 列数据的类型，支持多种预定义类型如 'date', 'currency', 'combination', 'imgList', 'imgListBase64', 'video', 'tags', 'tooltip', 'switch', 'wpsDate', 'edit', 'qrcode', 'fileList', 'tagsList', ''。
 * @property {string} [tagType] - 标签的类型，支持 'primary', 'success', 'warning', 'danger', 'info'。
 * @property {string} [minWidth] - 列的最小宽度。
 * @property {boolean | 'left' | 'right'} [fixed] - 列是否固定在左边或右边。
 * @property {boolean | 'custom'} [sortable] - 列是否可排序，支持自定义排序。
 * @property {Array<ColumnsType>} [columns] - 列的子列配置。
 * @property {Array<any>} [options] - 列的下拉选项，每个选项包含 label, value, type, color, bgColor。
 * @property {string} [tooltipClass] - 列提示信息的样式类。
 * @property {string} [fmt] - 用于格式化数据的方法。
 * @property {string} [className] - 列的样式类。
 * @property {(row: any, column: ColumnsType) => any} [renderText] - 自定义文本渲染函数。
 * @property {object} [switchConfig] - 配置开关字段的配置。
 * @property {object} switchConfig.active - 激活状态的字段配置。
 * @property {string} switchConfig.active.text - 激活状态显示的文本。
 * @property {any} switchConfig.active.value - 激活状态对应的值。
 * @property {string} [switchConfig.active.color] - 激活状态文本的颜色。
 * @property {object} switchConfig.inactive - 非激活状态的字段配置。
 * @property {string} switchConfig.inactive.text - 非激活状态显示的文本。
 * @property {any} switchConfig.inactive.value - 非激活状态对应的值。
 * @property {string} [switchConfig.inactive.color] - 非激活状态文本的颜色。
 * @property {object} [editConfig] - 编辑配置，包含 type 和 params。
 * @property {string} editConfig.type - 编辑类型，如 'input', 'textarea', 'password', 'number', 'select'。
 * @property {string} editConfig.params - 编辑参数。
 * @property {object} [qrcodeConfig] - 二维码配置，包含 name 和 logo。
 * @property {(row: any) => string} qrcodeConfig.name - 二维码名称生成函数。
 * @property {string} [qrcodeConfig.logo] - 二维码 logo 地址。
 * @property {(row: any) => boolean} [switchDisabled] - 开关是否禁用的判断函数。
 * @property {(row: any) => boolean} [editShow] - 是否显示编辑的判断函数。
 * @property {(row: any) => CSSProperties} [styleName] - 动态样式配置函数。
 */
export type ColumnsType = {
  label: string
  prop: string
  type?:
    | 'date'
    | 'currency'
    | 'combination'
    | 'imgList'
    | 'imgListBase64'
    | 'video'
    | 'tags'
    | 'tooltip'
    | 'switch'
    | 'wpsDate'
    | 'edit'
    | 'qrcode'
    | 'fileList'
    | 'tagsList'
    | 'link'
    | 'noTooltip'
    | ''
  tagType?: 'primary' | 'success' | 'warning' | 'danger' | 'info'
  minWidth?: string
  fixed?: boolean | 'left' | 'right'
  sortable?: boolean | 'custom'
  columns?: ColumnsType[]
  options?: {
    label: string
    value: any
    type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'
    color?: string
    bgColor?: string
  }[]
  tooltipClass?: string
  fmt?: string
  className?: string
  renderText?: (row: any, column: ColumnsType) => any
  renderCurrency?: (row: any, column: ColumnsType) => any
  switchConfig?: {
    active: {
      text: string
      value: any
      color?: string
    }
    inactive: {
      text: string
      value: any
      color?: string
    }
  }
  editConfig?: {
    type: 'input' | 'textarea' | 'password' | 'number' | 'select'
    params: string
  }
  qrcodeConfig?: {
    name: (row: any) => string
    logo?: string
  }
  switchDisabled?: (row: any) => boolean
  editShow?: (row: any) => boolean
  styleName?: (row: any) => CSSProperties
}
